// interface MSocket{
// }


export function createSocket(baseUrl: string,onMessageCallback:Function) {
// socket主要对象
    const socket: any = {
        webSocket: null,
        // 固定的WebSocket地址：此处是从env文件中读取socket地址，可以自行从其他config文件中读取或直接写死
        // 如需使用动态WebSocket地址，请自行作ajax通讯后扩展
        wsUrl: baseUrl,
        // 开启标识
        socketOpen: false,
        // 心跳timer
        hearBeatTimer: null,
        // 心跳发送频率
        hearBeatInterval: 5000,

        // 是否自动重连
        isReconnect: true,
        // 重连次数
        reconnectCount: 3,
        // 已发起重连次数
        reconnectCurrent: 1,
        // 重连timer
        reconnectTimer: null,
        // 重连频率
        reconnectInterval: 3000
    }

    /**
     * 初始化连接
     * urlSuffix:url后缀，可根据情况拼接url,如传递参数等等
     */
    function init(urlSuffix?: string) {
        if (!("WebSocket" in window)) {
            console.log('浏览器不支持WebSocket')
            return null
        }

        // 已经创建过连接不再重复创建
        if (socket.webSocket) {
            return socket.webSocket
        }

        //如果有后缀就拼接，防止重试时有路径不完整
        if (urlSuffix) {
            socket.wsUrl += urlSuffix;
        }

        socket.webSocket = new WebSocket(socket.wsUrl)
        socket.webSocket.onmessage = function (e: any) {
            receive(e)
        }

        // 关闭连接
        socket.webSocket.onclose = function (e: any) {
            console.log('连接已断开')
            console.log('connection closed (' + e.code + ')')
            clearInterval(socket.hearBeatInterval)
            socket.socketOpen = false

            // 需要重新连接
            if (socket.isReconnect) {
                socket.reconnectTimer = setTimeout(() => {
                    // 超过重连次数
                    if (socket.reconnectCurrent > socket.reconnectCount) {
                        clearTimeout(socket.reconnectTimer)
                        return
                    }
                    // 记录重连次数
                    socket.reconnectCurrent++
                    reconnect()
                }, socket.reconnectInterval)
            }
        }

        // 连接成功
        socket.webSocket.onopen = function () {
            console.log('连接成功')
            socket.socketOpen = true
            socket.isReconnect = true
            // 开启心跳
            heartbeat()
        }

        // 连接发生错误
        socket.webSocket.onerror = function () {
            console.log('WebSocket连接发生错误')
        }
    }


    /**
     * 心跳
     */
    function heartbeat() {
        console.log('socket', 'ping')
        if (socket.hearBeatTimer) {
            clearInterval(socket.hearBeatTimer)
        }

        socket.hearBeatTimer = setInterval(() => {
            const data = {
                kind: 0 //请求类型 kind 0 心跳包
            }
            send(data)
        }, socket.hearBeatInterval)
    }

    /**
     * 发送消息
     * @param {*} data 发送数据
     * @param {*} callback 发送后的自定义回调函数
     */
    function send(data: any, callback: Function | null = null) {
        // 开启状态直接发送
        if (socket.webSocket.readyState === socket.webSocket.OPEN) {
            socket.webSocket.send(JSON.stringify(data))

            if (callback) {
                callback()
            }

            // 正在开启状态，则等待1s后重新调用
        } else if (socket.webSocket.readyState === socket.webSocket.CONNECTING) {
            setTimeout(function () {
                send(data, callback)
            }, 1000)

            // 未开启，则等待1s后重新调用
        } else {
            init()
            setTimeout(function () {
                send(data, callback)
            }, 1000)
        }
    }


    /**
     * 主动关闭连接
     */
    function close() {
        console.log('主动断开连接')
        clearInterval(socket.hearBeatTimer)
        socket.isReconnect = false
        socket.webSocket.close()
    }

    /**
     * 重新连接
     */
    function reconnect() {
        console.log('发起重新连接', socket.reconnectCurrent)

        if (socket.webSocket && socket.socketOpen) {
            socket.webSocket.close()
        }
        init()
    }

    /**
     * 接收消息
     * @param {*} message 接收到的消息
     */
    function receive(message: any) {
        const params = JSON.parse(message.data)
        onMessageCallback(params)
        if (params.kind != 0) {
            console.log('收到服务器内容：', message.data)
        }

        if (params == undefined) {
            console.log("收到服务器空内容")
            return false
        }

        // 自行扩展其他业务处理...
    }

    function onMessage(callback:Function){
        socket.webSocket.onmessage = function ({data}: any) {
            callback(data)
            onMessageCallback(data)
        }
    }

    return {
        send,
        close,
        init,
        instance: socket,
        onMessage,
    }
}


